<?php
require './function.php';
/**
 * @Author: Wherein
 * @Date: 2021-03-31 11:07
 * @Descripttion: 桥接模式
 * @example 如果我现在是小米公司的雷布斯，小米公司旗下有小米mix和小米note手机，现在有一个底层的语音输出软件，由于小米mix的全面屏设计没有开孔使用了骨传导，所以和小米note有些不同。那么我们要如何来设计这个输出功能呢？
 */

// 抽象化角色
abstract class MiPhone{
    protected $_audio; // 存放音频软件对象

    abstract function output();

    public function __construct(Audio $audio)
    {
        $this->_audio = $audio;
    }
}

// 具体手机
class Mix extends MiPhone{
    public function output(){
        $this->_audio->output();
    }
}
class Note extends MiPhone{
    public function output(){
        $this->_audio->output();
    }
}

// 实现化角色 功能实现者
abstract class Audio{
    abstract function output();
}


// 具体音频实现者  骨传导音频输出
class Osteophony extends Audio{
    public function output(){
        dd('骨传导输出的声音---fuck');
    }
}

// 普通音频输出---声筒输出
class Cylinder extends Audio{
    public function output(){
        dd('声筒输出的声音---shit');
    }
}

// 让小米mix和小米note输出声音
$mix = new Mix(new Osteophony);
$mix->output();
$note = new Note(new Cylinder);
$note->output();

